package FileClient;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.util.Observable;

import Constants.constants;



/**
 * Denna klass är huvudklassen för client paketet. Dess uppgift är att skapa ett gui och två anslutningar
 * till två kameror och visa bilder från kameran efter användarens önskemål.
 * @author David
 *
 */
public class Client extends Observable {
	private OutputStream cam1OutputStream = null;
	private OutputStream cam2OutputStream = null;
	public static String id1;
	public static String id2;
	private boolean connected = false;
	private boolean inMovieMode = false;
	private PictureUpdateThread pT1;
	private PictureUpdateThread pT2;
	

	/**
	 * Konstruktor för klient. Skapar GUI, pictureHandler.
	 * Två PictureUpdateThread och två PictureQueue.
	 */
	public Client(String id1, String id2) {
		this.id1=id1;
		this.id2=id2;
		
		//this.gui = new GUI(this, syncHandler);
		//gui.setConnected(false);
		
//		pT1 = new PictureUpdateThread(gui, picQueue1, 1);
//		pT2 = new PictureUpdateThread(gui, picQueue2, 2);
//		pT1.start();
//		pT2.start();
	}
	
	/**
	 * Denna metod ansluter till en kamera och returnerar outputStream till den.
	 * @param id Den aktuella kamerans id tex: "192.168.0.1:8080" (ip-adress+":"+port)
	 * @return OutputStream för kameran
	 * @throws UnknownHostException
	 * @throws IOException
	 */
	private synchronized OutputStream connectCam(String id) throws UnknownHostException,
			IOException {
		Connection connection = new Connection(id);
		OutputStream os = connection.Connect(this);
		return os;
	}
	
	/**
	 * Anropas då en användare har tryckt på Connect- / Disconnect-knappen
	 */
	public synchronized void connectPressed() {
		if (!connected) {
			System.out.println("Connect pressed");
			try {
				cam1OutputStream = connectCam(id1);
				
			}catch (Exception e) {
				System.out.println("Could not connect camera: " + id1);
			}
			
			try{
				cam2OutputStream = connectCam(id2);
				connected = true;
				
			} catch (Exception e) {
				System.out.println("Could not connect camera: " + id2);
			}
		} else {
			System.out.println("Disconnect pressed");
			disconnect();
		}
	}
	
	/**
	 * Denna metod stänger ner anslutningen genom att meddela de som
	 * observerar(ClientInputs och Connections) samt genom att skicka
	 * kommandot TEAR_DOWN_CONNECTION till serversidan.
	 */
	public synchronized void disconnect() {
		try {
			cam1OutputStream.write(constants.TEAR_DOWN_CONNECTION);
			cam2OutputStream.write(constants.TEAR_DOWN_CONNECTION);
			
			// Stoppar trådarna.
//			try{
//				pT1.interrupt();
//				pT2.interrupt();
//			}catch(SecurityException e){
//				
//			}
			////
			
//			picQueue1.cleanQueue();
//			picQueue2.cleanQueue();
			
		} catch (Exception e) {
			System.out.println("Could not send tear down command to server side");
		}
		this.setChanged();
		this.notifyObservers();
		connected = false;
		inMovieMode = false;
	}
}
